//
//  YWVideoPlayerManager.m
//  videoTest3
//
//  Created by jun peng on 2022/5/30.
//

#import "YWVideoPlayerManager.h"
#import "YWDownloadManager3.h"

@interface YWCurrentVideoMessageModel ()

////////////////////////////////////////////////////////////////////////////

/** 播放模型 */
//@property (nonatomic ,strong) YWVideoItem  *item;

/** 播放路径 */
@property (nonatomic ,copy) NSString  *urlString;

//播放器(这里只读、为了读取player里面属性) //当前正在播放的播放器、里面就有更多你想知道的属性了
@property (nonatomic,strong)YWVodPlayer *player;

//0、这个当前播放的视频所在列表的位置、假如是列表传过来详情的就保存列表的位置（详情页返回去列表页能找到原来的列表cell位置继续播放就根据这个）
//1、假如是如推送直接去详情的就默认是-1
//2、假如是在详情页切换了URL就把它变成-1
//通过URL在player字典找到播放模型，通过这个模型在列表数组找到列表对应位置currentIndex✖️
//3、通过正在播放的currentPlayer的URL遍历数组找到对应的模型和index、假如找不到就把它变成-1、证明这个视频不是列表视频是详情视频
//@property(nonatomic, assign) NSInteger currentIndex;

////////////////////////////////////////////////////////////////////////////

/** 当前已经播放的时间 */
@property(nonatomic, assign) NSTimeInterval costTime;

/** 总时长 */
@property(nonatomic, assign) NSTimeInterval totalTime;

/** 可播放时长 */ //（这个可以制造缓冲进度条）
@property(nonatomic, assign) NSTimeInterval playableDuration;

////////////////////////////////////////////////////////////////////////////

/** 当前是否有正在播放 */
@property(nonatomic, assign) BOOL isPlaying;

/** 当前是否有静音 */
@property(nonatomic, assign) BOOL mute;

/** 视频宽高比 */
@property(nonatomic, assign) CGFloat videoRatio;

////////////////////////////////////////////////////////////////////////////

@end


@implementation YWCurrentVideoMessageModel


@end




@interface YWVideoPlayerManager ()<TXVodPlayListener,TXVodPreloadManagerDelegate>

//正在播放的信息
@property (nonatomic, strong) YWCurrentVideoMessageModel *currentVideoMessageModel;

//暂时不需要这个了
//要预加载播放的视频模型的字典（URL作为Key）
//@property (nonatomic, strong) NSMutableDictionary *videoItemDictionary;

//要预加载播放的视频播放器的字典（URL作为Key）
//@property (nonatomic, strong) NSMutableDictionary *playerDictionary;

//这里存播放器模型不存播放器了
@property (nonatomic, strong) NSMutableDictionary *playerStatusDictionary;



/**
*  调整当前歌曲的播放进度
*
*  @param startPlayBlock 开始
*  @param progressBlock 进度
*  @param endBlock 结束
*  @param loadingBlock 加载中
*/
@property(nonatomic,copy) void(^startPlayBlock)(void);
@property(nonatomic,copy) void(^progressBlock)(float progress,float duration,float playable);
@property(nonatomic,copy) void(^endBlock)(void);
@property(nonatomic,copy) void(^loadingBlock)(void);



//正在播放的播放器
@property (nonatomic,strong)YWVodPlayer *currnetPlayer;

//配置
@property (nonatomic,strong)TXVodPlayConfig *config;

@end


@implementation YWVideoPlayerManager


SingleM(videoPlayerManager)


@synthesize currentVideoMessageModel = _currentVideoMessageModel;





//
////0、这个当前播放的视频所在列表的位置、假如是列表传过来详情的就保存列表的位置（详情页返回去列表页能找到原来的列表cell位置继续播放就根据这个）
////1、假如是如推送直接去详情的就默认是-1
////2、假如是在详情页切换了URL就把它变成-1
////通过URL在player字典找到播放模型，通过这个模型在列表数组找到列表对应位置currentIndex✖️
////3、通过正在播放的currentPlayer的URL遍历数组找到对应的模型和index、假如找不到就把它变成-1、证明这个视频不是列表视频是详情视频
//@property(nonatomic, assign,readonly) NSInteger currentIndex;
//


//- (instancetype)init
//{
//    self = [super init];
//    if (self) {
//        self.statusItemArray = [NSMutableArray array];
//    }
//    return self;
//}

#pragma mark - 懒加载
-(YWCurrentVideoMessageModel *)currentVideoMessageModel{
    
    if (_currentVideoMessageModel == nil) {
        _currentVideoMessageModel = [[YWCurrentVideoMessageModel alloc] init];
    }
    
    //假如当前还没有播放器就不走下面了
    if (self.currnetPlayer == nil) {
        return [[YWCurrentVideoMessageModel alloc] init];
    }
    
    
    //好像只在列表VC弄一个正在播放index属性好一点、因为只是列表VC想知道“自己”的currentIndex、详情VC不想知道
//应该不是在这样设置currentIndex
////    BOOL isExist = NO;
//    //先默认是-1
//    NSInteger index = -1;
//    for (NSInteger i = 0; i<self.statusItemArray.count; i++) {
//
//        YWVideoItem *item = self.statusItemArray[i];
//
//
//        if (item.statusType == YWStatusType_YWGetNewsDataStatus) {
//
//            if (item.videoStatusType == YWVideoStatusTypeVideo || item.videoStatusType == YWVideoStatusTypeLittleVideo) {
//
//                YWGetNewsDataStatus *dataStatus = (YWGetNewsDataStatus *)item.status;
//
//                if ([dataStatus.FileUrl isEqualToString:self.currnetPlayer.urlString]) {
////                    isExist = YES;
//                    index = i;
//
//                    break;;
//                }
//
//
//            }
//        }
//
//
//    }
//
//    _currentVideoMessageModel.currentIndex = index;
    
    
    
    // 在这个地方, 保证数据最新状态, 等于, 外界, 绝对可以获取到最新数据
    
    _currentVideoMessageModel.player = self.currnetPlayer;
    
    
    _currentVideoMessageModel.playableDuration = self.currnetPlayer.playableDuration;
    
    _currentVideoMessageModel.mute = self.currnetPlayer.ywMute;
    
    
    //设置当前播放路径
    _currentVideoMessageModel.urlString = self.currnetPlayer.urlString;
    
    
//    player不需要item，它们不是包含关系
    //设置当前播放item
//    _currentVideoMessageModel.item = self.videoTool.item;
    
    // 设置最新的播放时间
    _currentVideoMessageModel.costTime = self.currnetPlayer.currentPlaybackTime;
    
    // 设置播放的总时间
    _currentVideoMessageModel.totalTime = self.currnetPlayer.duration;
    
    // 设置当前是否正在播放
    _currentVideoMessageModel.isPlaying = self.currnetPlayer.isPlaying;
    
    
    _currentVideoMessageModel.videoRatio = (GLfloat)self.currnetPlayer.width / self.currnetPlayer.height;
    
    return _currentVideoMessageModel;
}

-(NSMutableDictionary *)playerStatusDictionary{
    if (_playerStatusDictionary == nil) {
        _playerStatusDictionary = [NSMutableDictionary dictionary];
    }
    return _playerStatusDictionary;
}


//-(NSMutableDictionary *)playerDictionary{
//    if (_playerDictionary == nil) {
//        _playerDictionary = [NSMutableDictionary dictionary];
//    }
//    return _playerDictionary;
//}

-(TXVodPlayConfig *)config{
    if (_config == nil) {
         _config = [[TXVodPlayConfig alloc] init];
       
        //下面的废弃了
        /*
        // 设置缓存路径
//        _config.cacheFolderPath = YWCacheFilepath;
//
//        YWLog(@"%@",YWCacheFilepath);
//
        // 设置最多缓存多少个文件，避免缓存太多数据 (有了这个就不需要手动清理缓存了)
        //测试过了、尽管有多个播放器、但是maxCacheItems共用
//        _config.maxCacheItems = 10;
        
//         * 最大预加载大小，单位 MB
//         *  此设置会影响playableDuration，设置越大，提前缓存的越多✖️ - 》 这个变成了  播放时最大缓冲大小。单位：MB、这里不需要用到
      
//        _config.maxBufferSize = 20;
        */
        
        
        //所以_config只需要这一句
        
        //1、预播放缓冲大小、设置单个视频每个视频最多预缓冲2MB
        [_config setMaxPreloadSize:(2)];;  // 预播放最大缓冲大小。单位：MB, 根据业务情况设置去节省流量
        
//播放缓冲大小、在视频正常播放时，控制提前从网络缓冲的最大数据大小。如果不配置，则走播放器默认缓冲策略、、、保证流畅播放。所以我这里就不设置了
//[_config setMaxBufferSize:10];  // 播放时最大缓冲大小。单位：MB
        
        //2、设置整个沙盒的"/preload"文件夹最多预缓冲200MB（关闭app会清空沙盒）
        [self preload_PlayerGlobalSetting];
        
    }
    return _config;
}

//设置整个沙盒的"/preload"文件夹最多预缓冲200MB（关闭app会清空沙盒）
-(void)preload_PlayerGlobalSetting{

    NSError *error = nil;
    //设置播放引擎的全局缓存目录
//    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//    NSString *documentsDirectory = [paths objectAtIndex:0];
//    NSString *preloadDataPath = [documentsDirectory stringByAppendingPathComponent:@"/preload"];
    if (![[NSFileManager defaultManager] fileExistsAtPath:YWVideoCachepath]) {
         [[NSFileManager defaultManager] createDirectoryAtPath:YWVideoCachepath
                                   withIntermediateDirectories:NO
                                                    attributes:nil
                                                         error:&error];
    }
    
    YWLog(@"%@",YWVideoCachepath);
    
    
    [TXPlayerGlobalSetting setCacheFolderPath:YWVideoCachepath];
    //设置播放引擎缓存大小
    [TXPlayerGlobalSetting setMaxCacheSize:200];

}

///////////////////////////////////////////////////////、、、获取当前播放视频的信息\数组&字典
///
///
///

//预加载这个数组
-(void)preLoadUrlArray:(NSArray <NSString *>*)urlArray{
    
    //先停止播放上一个播放器的视频播放 （这里不要停止播放上一个视频了、因为万一是上拉加载更多获取了更多item也没理由去停止上一个视频）
//    [self stopLastPlayItem];
    
    //不需要模型字典了
    //这里要重新清除之前的创建一个新的来装东西
//    NSMutableDictionary *mItemDic = [[NSMutableDictionary alloc] init];
    
    //这个不要清空、要不断增加player的、假如字典本身存在这个播放器就会根据key来覆盖原来的播放器？所以我不能让它覆盖我之前的播放器，因为我的costTime要保存到内存、除非你把costTime保存到沙盒、或者你有必要手动把costTime置0重新进度播放
//    NSMutableDictionary *mPlayerDic = [[NSMutableDictionary alloc] init];
    
    for (NSString *FileUrl in urlArray) {
        
//        if (item.statusType == YWStatusType_YWGetNewsDataStatus) {
//
//            if (item.videoStatusType == YWVideoStatusTypeVideo || item.videoStatusType == YWVideoStatusTypeLittleVideo) {
//
//                YWGetNewsDataStatus *dataStatus = (YWGetNewsDataStatus *)item.status;
                
                //这里不要这样做了
//                [mItemDic setObject:item forKey:dataStatus.FileUrl];
//                [mPlayerDic setObject:player forKey:dataStatus.FileUrl];
                
                //假如字典不存在播放器才创建新播放器加入字典、为了不会以新播放器覆盖旧播放器
                if (![self.playerStatusDictionary.allKeys containsObject:FileUrl]) {
//                    YWVodPlayer *player = [[YWVodPlayer alloc] init];
//
//                    //这个urlString是我自定义player增加的属性来保存
//                    player.urlString = FileUrl;
//
//                    //设置画面Mode
//                    [player setRenderMode:RENDER_MODE_FILL_EDGE];
//
//                    //设置循环播放
//                    player.loop = YES;
//
//                    //设置缓存配置
//                    [player setConfig: self.config];
//
//                    //预加载
//                    player.isAutoPlay = NO;
//                    [player startPlay:FileUrl];
                    
                    YWPlayerStatus *playerStatus = [[YWPlayerStatus alloc] init];
                    playerStatus.urlString = FileUrl;
                    
                    
                    //预加载-缓存视频之前要写这个
                    //2、设置整个沙盒的"/preload"文件夹最多预缓冲200MB（关闭app会清空沙盒）
                    [self preload_PlayerGlobalSetting];
                    
                    //预加载-缓存视频
                    [[TXVodPreloadManager sharedManager] startPreload:FileUrl  preloadSize:10  preferredResolution:1920*1080  delegate:self];
                    
                    [self.playerStatusDictionary setObject:playerStatus forKey:FileUrl];
                }
               
                
                
//            }
//
//        }
        //YWStatusType_YWOther这个其它类型的暂时不做
//        else if (item.statusType == YWStatusType_YWOther){
//            if (item.videoStatusType == YWVideoStatusTypeVideo || item.videoStatusType == YWVideoStatusTypeLittleVideo) {
//            }
//        }
        
    }
    
//    self.videoItemDictionary = mItemDic;
//    self.playerDictionary = mPlayerDic;
    
    
    
    
}
/*
//装列表模型的数组（外面列表的模型封装成YWVideoItem再装去数组传过来给我里面处理）
//-(void)setStatusItemArray:(NSMutableArray<YWVideoItem *> *)statusItemArray{
//
//    _statusItemArray = statusItemArray;
//
//    //先停止播放上一个播放器的视频播放 （这里不要停止播放上一个视频了、因为万一是上拉加载更多获取了更多item也没理由去停止上一个视频）
////    [self stopLastPlayItem];
//
//    //不需要模型字典了
//    //这里要重新清除之前的创建一个新的来装东西
////    NSMutableDictionary *mItemDic = [[NSMutableDictionary alloc] init];
//
//    //这个不要清空、要不断增加player的、假如字典本身存在这个播放器就会根据key来覆盖原来的播放器？所以我不能让它覆盖我之前的播放器，因为我的costTime要保存到内存、除非你把costTime保存到沙盒、或者你有必要手动把costTime置0重新进度播放
////    NSMutableDictionary *mPlayerDic = [[NSMutableDictionary alloc] init];
//
//    for (YWVideoItem *item in statusItemArray) {
//
//        if (item.statusType == YWStatusType_YWGetNewsDataStatus) {
//
//            if (item.videoStatusType == YWVideoStatusTypeVideo || item.videoStatusType == YWVideoStatusTypeLittleVideo) {
//
//                YWGetNewsDataStatus *dataStatus = (YWGetNewsDataStatus *)item.status;
//
//                //这里不要这样做了
////                [mItemDic setObject:item forKey:dataStatus.FileUrl];
////                [mPlayerDic setObject:player forKey:dataStatus.FileUrl];
//
//                //假如字典不存在播放器才创建新播放器加入字典、为了不会以新播放器覆盖旧播放器
//                if (![self.playerDictionary.allKeys containsObject:dataStatus.FileUrl]) {
//                    YWVodPlayer *player = [[YWVodPlayer alloc] init];
//
//                    //这个urlString是我自定义player增加的属性来保存
//                    player.urlString = dataStatus.FileUrl;
//
//                    //设置画面Mode
//                    [player setRenderMode:RENDER_MODE_FILL_EDGE];
//
//                    //设置循环播放
//                    player.loop = YES;
//
//                    //设置缓存配置
//                    [player setConfig: self.config];
//
//                    //预加载
//                    player.isAutoPlay = NO;
//                    [player startPlay:dataStatus.FileUrl];
//
//                    [self.playerDictionary setObject:player forKey:dataStatus.FileUrl];
//                }
//
//
//
//            }
//
//        }
//        //YWStatusType_YWOther这个其它类型的暂时不做
////        else if (item.statusType == YWStatusType_YWOther){
////            if (item.videoStatusType == YWVideoStatusTypeVideo || item.videoStatusType == YWVideoStatusTypeLittleVideo) {
////            }
////        }
//
//    }
//
////    self.videoItemDictionary = mItemDic;
////    self.playerDictionary = mPlayerDic;
//}
*/
///////////////////////////////////////////////////////、、、操控视频方法

// 调整当前歌曲的播放进度
- (void)seekToTime:(NSTimeInterval)time{
    
    //这里我不需要再用模型来保存costTime了（代理也不需要做保存costTime处理）、因为self.currnetPlayer和player字典对应的player是同一个对象、costTime在player自动保存了
    
    // 更新视频进度
    [self.currnetPlayer seek:time];
    
    YWPlayerStatus *playStatus = self.playerStatusDictionary[self.currnetPlayer.urlString];
    playStatus.costTime = time;
    
    
}

// 设置是否静音
- (void)setMute:(BOOL)isMute{
    
    
    self.currnetPlayer.ywMute = isMute;
    
    [self.currnetPlayer setMute:isMute];
    
    YWPlayerStatus *playStatus = self.playerStatusDictionary[self.currnetPlayer.urlString];
    playStatus.ywMute = isMute;
}

/**
 * 设置播放速率
 * @param rate 正常速度为1.0；小于为慢速；大于为快速。最大建议不超过2.0
 */
- (void)setRate:(float)rate{
    
    [self.currnetPlayer setRate:rate];
}

/**
 * 设置音量大小
 * @param volume 音量大小。范围：0 ~ 100。
 */
- (void)setAudioPlayoutVolume:(int)volume{
    
    [self.currnetPlayer setAudioPlayoutVolume:volume];
}

///////////////////////////////////////////////////////、、、播放暂停继续停止方法
///


//开始播放
-(void)startPlayWithUrl:(NSString *)fileUrl view:(UIView *)videoView complication:(void(^)(void))complication startPlay:(void(^)(void))startPlayBlock progress:(void(^)(float progress,float duration,float playable))progressBlock end:(void(^)(void))endBlock loading:(void(^)(void))loadingBlock{
    
    //先停止播放上一个播放器的视频播放
    [self stopLastPlayer];
    
    //保存当开始正在结束缓冲过程完成的代码、在代理调用
    self.startPlayBlock = startPlayBlock;
    self.progressBlock = progressBlock;
    self.endBlock = endBlock;
    self.loadingBlock = loadingBlock;
    
    
    YWVodPlayer *player = [[YWVodPlayer alloc] init];
    
    player.urlString = fileUrl;
    
    //设置画面Mode
    [player setRenderMode:RENDER_MODE_FILL_EDGE];
    
    //设置循环播放
    player.loop = YES;
    
    //设置缓存配置
    [player setConfig: self.config];
    
    //预加载
    player.isAutoPlay = YES;
    
    self.currnetPlayer = player;
    
    [self.currnetPlayer setupVideoWidget:videoView insertIndex:0];
     
    
    YWPlayerStatus *playerStatus = self.playerStatusDictionary[fileUrl];
            
            //（假如是列表的视频通常都会来这里）
            if (playerStatus != nil) {
                
                player.costTime = playerStatus.costTime;
                player.ywMute = playerStatus.ywMute;
                
                
                
                // 更新视频进度（之前看到哪里就哪里开始播放）
                if (player.costTime > 0) {
                    
                    [self.currnetPlayer setStartTime:self.currnetPlayer.costTime];
                }
                
                //将之前是否静音重新赋值给播放器
                [self.currnetPlayer setMute:playerStatus.ywMute];
                
                
            }
            else{ //假如字典没有的话就直接创建一个播放器、同时记得加入字典和数组
                
                YWPlayerStatus *playerStatus = [[YWPlayerStatus alloc] init];
                playerStatus.urlString = fileUrl;
                
                //要存入字典保存播放器
                [self.playerStatusDictionary setObject:playerStatus forKey:fileUrl];
                
                
            }
    
    
            //开始播放
           [self.currnetPlayer startPlay:fileUrl];
   
    
    
//        }
//
//    }
    
    self.currnetPlayer.vodDelegate = self;
    
    if (complication) {
        complication();
    }
    
}


//去其它view继续播放，但不要先停止之前正在播放的
-(void)continuePlayWithAnthorView:(UIView *)videoView complication:(void(^)(void))complication startPlay:(void(^)(void))startPlayBlock progress:(void(^)(float progress,float duration,float playable))progressBlock end:(void(^)(void))endBlock loading:(void(^)(void))loadingBlock{
    
    //这里要移除上一个view
    //保存当开始正在结束缓冲过程完成的代码、在代理调用
    self.startPlayBlock = startPlayBlock;
    self.progressBlock = progressBlock;
    self.endBlock = endBlock;
    self.loadingBlock = loadingBlock;
    
    
    //这里要移除上一个view
    if (self.currnetPlayer != nil) {
        
        [self.currnetPlayer removeVideoWidget]; // 记得销毁 view 控件
        
        [self.currnetPlayer setupVideoWidget:videoView insertIndex:0];
    }
    
    if (complication) {
        complication();
    }
    
    
    
}

/*
//开始播放
//-(void)startPlayWithUrl:(NSString *)fileUrl view:(UIView *)videoView complication:(void(^)(void))complication startPlay:(void(^)(void))startPlayBlock progress:(void(^)(float progress,float duration,float playable))progressBlock end:(void(^)(void))endBlock loading:(void(^)(void))loadingBlock{
//
//    //先停止播放上一个播放器的视频播放
//    [self stopLastPlayer];
//
//    //保存当开始正在结束缓冲过程完成的代码、在代理调用
//    self.startPlayBlock = startPlayBlock;
//    self.progressBlock = progressBlock;
//    self.endBlock = endBlock;
//    self.loadingBlock = loadingBlock;
//
//    //我改成了传入fileUrl，就不需要做下面的判断了
////    if (item.statusType == YWStatusType_YWGetNewsDataStatus) {
////
////        if (item.videoStatusType == YWVideoStatusTypeVideo || item.videoStatusType == YWVideoStatusTypeLittleVideo) {
////
////            YWGetNewsDataStatus *dataStatus = (YWGetNewsDataStatus *)item.status;
//
//            //从字典拿出模型播放
//        YWVodPlayer *player = self.playerDictionary[fileUrl];
//
//            //（假如是列表的视频通常都会来这里）
//            if (player != nil) {
//                self.currnetPlayer = player;
//
//                [self.currnetPlayer setupVideoWidget:videoView insertIndex:0];
//
//                // 更新视频进度（之前看到哪里就哪里开始播放）
//                if (self.currnetPlayer.costTime > 0) {
//
//                    [self.currnetPlayer setStartTime:self.currnetPlayer.costTime];
//
//
//                }
//
//                //停止播放后就不能继续resume了、只能用startPlay、但是它并不影响我已经缓存的视频、不会重新下载存储好在本地的视频、假如它对我player属性有影响例如currentPlaybackTime的话、我自己弄多一个属性给自定义player保存就好了、如弄一个costTime属性
////                [self.currnetPlayer resume];
//
//               [self.currnetPlayer startPlay:fileUrl];
//            }
//            else{ //假如字典没有的话就直接创建一个播放器、同时记得加入字典和数组
//
//                YWVodPlayer *player = [[YWVodPlayer alloc] init];
//
//                player.urlString = fileUrl;
//
//                //设置画面Mode
//                [player setRenderMode:RENDER_MODE_FILL_EDGE];
//
//                //设置循环播放
//                player.loop = YES;
//
//                //设置缓存配置
//                [player setConfig: self.config];
//
//                //预加载
//                player.isAutoPlay = YES;
//
//                self.currnetPlayer = player;
//
//                [self.currnetPlayer setupVideoWidget:videoView insertIndex:0];
//
//                [self.currnetPlayer startPlay:fileUrl];
//
//                //要存入字典保存播放器
//                [self.playerDictionary setObject:player forKey:fileUrl];
//
////                self.playerDictionary = [NSMutableDictionary dictionaryWithDictionary:@{dataStatus.FileUrl:player}];
//                //不需要存入数组
//                //因为之前字典找不到，所以之前肯定没有做setArray
////                self.statusItemArray = [NSMutableArray arrayWithArray:@[item]];
////                self.videoItemDictionary = [NSMutableDictionary dictionaryWithDictionary:@{dataStatus.FileUrl:item}];
//
//
//
//            }
////        }
////
////    }
//
//    self.currnetPlayer.vodDelegate = self;
//
//}

//这个不需要了、统一用startPlayWithItem、我在startPlayWithItem做了判断两种情况、相当于包含了resumePlayWithItem
//预加载过的播放
//-(void)resumePlayWithItem:(NSString *)fileUrl view:(UIView *)videoView complication:(void(^)(void))complication startPlay:(void(^)(void))startPlayBlock progress:(void(^)(float progress,float duration))progressBlock end:(void(^)(void))endBlock loading:(void(^)(void))loadingBlock{
//   
//    //先停止播放上一个播放器的视频播放
//    [self stopLastPlayer];
//    
//    //保存当开始正在结束缓冲过程完成的代码、在代理调用
//    self.startPlayBlock = startPlayBlock;
//    self.progressBlock = progressBlock;
//    self.endBlock = endBlock;
//    self.loadingBlock = loadingBlock;
//    
//    
//    //我改成了传入fileUrl，就不需要做下面的判断了
////    if (item.statusType == YWStatusType_YWGetNewsDataStatus) {
////
////        if (item.videoStatusType == YWVideoStatusTypeVideo || item.videoStatusType == YWVideoStatusTypeLittleVideo) {
////
////            YWGetNewsDataStatus *dataStatus = (YWGetNewsDataStatus *)item.status;
//            
//            //从字典拿出模型播放
//            YWVodPlayer *player = self.playerDictionary[fileUrl];
//            
//            if (player != nil) {
//                self.currnetPlayer = player;
//                
//                [self.currnetPlayer setupVideoWidget:videoView insertIndex:0];
//                
//                // 更新视频进度（之前看到哪里就哪里开始播放）
//                if (item.costTime > 0) {
//                    
//                    [self.currnetPlayer setStartTime:item.costTime];
//                    
//                    
//                }
//                
//                [self.currnetPlayer resume];
//            }
////        }
////
////    }
//    
//    
//}
*/

//暂停播放
-(void)pausePlayWithComplication:(void(^)(void))complication{
    
    [self.currnetPlayer pause];
    
    if (complication) {
        complication();
    }
    
    
}

//继续播放
-(void)continuePlayWithComplication:(void(^)(void))complication{
    
    [self.currnetPlayer resume];
    
    if (complication) {
        complication();
    }
}

//停止播放
-(void)stopPlayWithComplication:(void(^)(void))complication{
   
    [self stopPlay];
    
    if (complication) {
        complication();
    }
    
}


//停止播放上一个视频
-(void)stopLastPlayer{
    
    [self stopPlay];
}

-(void)stopPlay{
    
    //这里要先停止播放上一个播放器
    if (self.currnetPlayer != nil) {
        
        self.currnetPlayer.vodDelegate = nil;
        
        [self.currnetPlayer stopPlay];
        
        [self.currnetPlayer removeVideoWidget]; // 记得销毁 view 控件
    }
    
    //置nil
    self.currnetPlayer = nil;
    
    //block全部置nil、防止被销毁的监听者继续监听
    self.startPlayBlock = nil;
    self.progressBlock = nil;
    self.endBlock = nil;
    self.loadingBlock = nil;
}



-(void)dealloc{
    
    [self.currnetPlayer stopPlay];
    
    [self.currnetPlayer removeVideoWidget]; // 记得销毁 view 控件
    
}


/**
 * 点播事件通知
 *
 * @param player 点播对象
 * @param EvtID 参见TXLiveSDKTypeDef.h
 * @param param 参见TXLiveSDKTypeDef.h
 * @see TXVodPlayer
 */
-(void) onPlayEvent:(TXVodPlayer *)player event:(int)EvtID withParam:(NSDictionary*)param{
    
     NSDictionary* dict = param;
     dispatch_async(dispatch_get_main_queue(), ^{
     if (EvtID == PLAY_EVT_PLAY_BEGIN)
     {
         //开始播放
         if (self.startPlayBlock) {
             self.startPlayBlock();
         }
         
         
     }
     else if(EvtID == PLAY_EVT_PLAY_PROGRESS)
     {
//处理播放进度
//         float progress = [dict[EVT_PLAY_PROGRESS] floatValue];
//         self.currentTimeLabel.text = [NSString stringWithFormat:@"%02d:%02d",
//         (int)progress/60,(int)progress%60];
//
//         float duration = [dict[EVT_PLAY_DURATION] floatValue];
//         self.totalTimeLabel.text = [NSString stringWithFormat:@"%02d:%02d",
//         (int)duration/60,(int)duration%60];
//
//         [self.progressSlider setValue:progress*1.0/duration];
         
         
         float progress = [dict[EVT_PLAY_PROGRESS] floatValue];
         
         float duration = [dict[EVT_PLAY_DURATION] floatValue];
         
         float playable = [dict[EVT_PLAYABLE_DURATION] floatValue]; //缓冲进度
         
         
         self.currnetPlayer.costTime = progress;
         
         
         YWPlayerStatus *playStatus = self.playerStatusDictionary[self.currnetPlayer.urlString];
         playStatus.costTime = progress;
         
         
         if (self.progressBlock) {
             self.progressBlock(progress, duration, playable);
         }
         
         
     }
     else if (EvtID == PLAY_ERR_NET_DISCONNECT || EvtID == PLAY_EVT_PLAY_END)
     {
     // 播放结束的事件
         if (self.endBlock) {
             self.endBlock();
         }
         
         
         
     }
     else if (EvtID == PLAY_EVT_PLAY_LOADING)
     {
         
         
         if (self.loadingBlock) {
             self.loadingBlock();
         }
         
     }
     });
}

/**
 * 网络状态通知
 *
 * @param player 点播对象
 * @param param 参见TXLiveSDKTypeDef.h
 * @see TXVodPlayer
 */
-(void) onNetStatus:(TXVodPlayer *)player withParam:(NSDictionary*)param{
    
    
//    通过onNetStatus的NET_SPEED获取当前网速。具体使用方法见 状态反馈（onNetStatus）。
//    监听到PLAY_EVT_PLAY_LOADING事件后，显示当前网速。
//    收到PLAY_EVT_VOD_LOADING_END事件后，对显示当前网速的 view 进行隐藏。

    //目前来看好像不需要这个、因为目前是Wi-Fi还是蜂窝不能用这个代理判断
    
    
    //判断是否视频加载中是用上面的onPlayEvent:(TXVodPlayer *)player event:(int)EvtID withParam:(NSDictionary*)param代理方法
    
    
    
}


- (void)snapshot:(void (^)(UIImage *))snapshotCompletionBlock{
    
    [self.currnetPlayer snapshot:^(UIImage *image) {
        if (snapshotCompletionBlock) {
            snapshotCompletionBlock(image);
        }
    }];
    
    
}
// 将当前时间变成字符串
+(NSString *)stringWithTime:(NSTimeInterval)time{
    
    NSInteger cMin = time / 60;
    
    NSInteger cSec = (NSInteger)time % 60;
    
    NSString *timeString = [NSString stringWithFormat:@"%02ld:%02ld", cMin, cSec];
    
    return timeString;
}






//能在本地播放还是只能在网上播放
+(void)videoPlayWithKLineCheatsVideoListDataStatus:(YWKLineCheatsVideoListDataStatus *)status canPlayLoacalWithFullPathBlock:(void(^)(NSString *fullPath))canPlayLoacalWithFullPathBlock onlyCanPlayWebWithVideoUrlBlock:(void(^)(NSString *videoUrl))onlyCanPlayWebWithVideoUrlBlock{
    
    //测试
    if (status.kLineCheatsVideoListType == YWKLineCheatsVideoListD_Finish3) { //1、枚举对了
        
        [YWDownloadManager3 judgeStatusExistInFinishDataBase:status.VideoUrl ifExist:^(YWDownloadStatus3 * _Nonnull downloadStatus) { //2、数据库存在模型
            
            if ([[NSFileManager defaultManager] fileExistsAtPath:downloadStatus.fullPath]) { //3、沙盒存在路径
                if (canPlayLoacalWithFullPathBlock) {
                    canPlayLoacalWithFullPathBlock(downloadStatus.fullPath);
                }
            }
            else{
                if (onlyCanPlayWebWithVideoUrlBlock) {
                    onlyCanPlayWebWithVideoUrlBlock(status.VideoUrl);
                }
            }
        } ifNoExist:^{
            if (onlyCanPlayWebWithVideoUrlBlock) {
                onlyCanPlayWebWithVideoUrlBlock(status.VideoUrl);
            }
        }];
    }
    else{
        if (onlyCanPlayWebWithVideoUrlBlock) {
            onlyCanPlayWebWithVideoUrlBlock(status.VideoUrl);
        }
    }
    
}





@end
